`timescale 1ns / 1ps

module ip_2port_ram(
    input sys_clk_p, //系统输入差分时钟
    input sys_clk_n, //系统输入差分时钟
    input sys_rst_n //系统复位，低电平有效
);

    //wire define
    wire sys_clk ; //系统单端时钟
    wire ram_wr_en ; //端口 A 使能
    wire ram_wr_we ; //ram 端口 A 写使能
    wire ram_rd_en ; //端口 B 使能
    wire rd_flag ; //读启动标志
    wire [5:0] ram_wr_addr; //ram 写地址
    wire [7:0] ram_wr_data; //ram 写数据
    wire [5:0] ram_rd_addr; //ram 读地址
    wire [7:0] ram_rd_data; //ram 读数据

    //*****************************************************
    //** main code
    //*****************************************************

    //转换差分信号
    IBUFDS diff_clock
    (
        .I (sys_clk_p), //差分输入时钟
        .IB(sys_clk_n), //系统差分输入时钟
        .O (sys_clk) //输出系统时钟
    );

    //RAM 写模块
    ram_wr u_ram_wr(
        .clk (sys_clk ),
        .rst_n (sys_rst_n ),

        .rd_flag (rd_flag ),
        .ram_wr_en (ram_wr_en ),
        .ram_wr_we (ram_wr_we ),
        .ram_wr_addr (ram_wr_addr),
        .ram_wr_data (ram_wr_data)
    );

    //简单双端口 RAM
    blk_mem_gen_0 u_blk_mem_gen_0 (
        .clka (sys_clk ), // input wire clka
        .ena (ram_wr_en ), // input wire ena
        .wea (ram_wr_we ), // input wire [0 : 0] wea
        .addra (ram_wr_addr), // input wire [5 : 0] addra
        .dina (ram_wr_data), // input wire [7 : 0] dina
        .clkb (sys_clk ), // input wire clkb
        .enb (ram_rd_en ), // input wire enb
        .addrb (ram_rd_addr), // input wire [5 : 0] addrb
        .doutb (ram_rd_data) // output wire [7 : 0] doutb
    );

    //RAM 读模块
    ram_rd u_ram_rd(
        .clk (sys_clk ),
        .rst_n (sys_rst_n ),

        .rd_flag (rd_flag ),
        .ram_rd_en (ram_rd_en ),
        .ram_rd_addr (ram_rd_addr),
        .ram_rd_data (ram_rd_data)
    );

    ila_0 u_ila_0 (
        .clk (sys_clk ), // input wire clk

        .probe0 (ram_wr_en ), // input wire [0:0] probe0
        .probe1 (ram_wr_we ), // input wire [0:0] probe1
        .probe2 (ram_rd_en ), // input wire [0:0] probe2
        .probe3 (rd_flag ), // input wire [0:0] probe3
        .probe4 (ram_wr_addr), // input wire [5:0] probe4
        .probe5 (ram_wr_data), // input wire [7:0] probe5
        .probe6 (ram_rd_addr), // input wire [5:0] probe6
        .probe7 (ram_rd_data) // input wire [7:0] probe7
    );

endmodule
